package net.wy.commons.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;

import org.apache.commons.lang.StringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件系统相关
 * @author lcs
 *
 */
public class FileUtil {
	/**
	 * 文件存放的磁盘路径
	 */
	private static String diskPath;
	
	/**
	 * 计算文件指纹的算法
	 */
	private static final String ALGORITHM = "SHA-1";
	
	public static String upload(MultipartFile file){
		return FileUtil.upload(file, null);
	}
	/**
	 * 保存上传的文件
	 * @param file 文件
	 * @param savePath 保存路径（相对，可空）
	 * @return saveName
	 */
    public static String upload(MultipartFile file, String savePath){
    	File disk = new File(FileUtil.diskPath);
    	if(StringUtils.isNotBlank(savePath)){
    		disk = new File(disk.getAbsolutePath()+"/"+savePath);
    	}
    	
		if(!disk.exists()){
			disk.mkdirs();
    	}
		String saveName = FileUtil.getFileCode(file);
		File toFile =new File(disk.getAbsolutePath() + "/" + saveName);
		try {
			file.transferTo(toFile);
			return saveName;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
    
    /**
	 * 计算文件指纹
	 * @param path 文件路径
	 * @return null-出错
	 */
	public static String getFileCode(String path){
		if(StringUtils.isBlank(path)){
			return null;
		}
		
		return FileUtil.getFileCode( new File(path) );
	}
	
	/**
	 * 计算文件指纹
	 * @param path 文件
	 * @return null-出错
	 */
	public static String getFileCode(File file){
		if(file == null){
			return null;
		}

		try {
			return FileUtil.getFileCode(new FileInputStream(file));
		} catch (FileNotFoundException e) {
			return null;
		}
	}
	
	/**
	 * 计算文件指纹
	 * @param path 文件
	 * @return null-出错
	 */
	public static String getFileCode(MultipartFile file){
		if(file == null){
			return null;
		}
		
		try {
			return FileUtil.getFileCode(file.getInputStream());
		} catch (Exception e) {
			return null;
		}
	}
	
	/**
	 * 计算文件指纹
	 * @param path 文件路径
	 * @return null-出错
	 */
	public static String getFileCode(InputStream in){
		if(in == null){
			return null;
		}
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance(FileUtil.ALGORITHM);
			byte[] buffer = new byte[1024 * 1024 * 10];
			int len = 0;

			while ((len = in.read(buffer)) > 0) {
				messageDigest.update(buffer, 0, len);
			}
		} catch (Exception e) {
			return null;
		} finally {
			if(in != null){
				try {
					in.close();
				} catch (IOException e) {
					return null;
				}
			}
		}
		return messageDigest == null ? null : ToolUtil.byte2hex(messageDigest.digest());
	}
    
	public static String getDiskPath() {
		return FileUtil.diskPath;
	}
	public static void setDiskPath(String diskPath) {
		FileUtil.diskPath = diskPath;
	}
    
}
